using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Diagnostics;
using System.IO;

namespace ImageCompressor
{
    /// <summary>
    /// ProgressBar类有点问题，重写一个简单的ProgressBar。
    /// </summary>
    internal class NewProgressPanel:Panel
    {
        public Font TextFont;
        public Brush TextForeColor;
        public NewProgressPanel(Font textFont,Color textForeColor)
        {
            this.TextFont = textFont;
            this.TextForeColor = new SolidBrush(textForeColor);
            SetStyle(ControlStyles.ResizeRedraw, true);
            this.foreBrush = new SolidBrush(Color.Gray);
        }
        /// <summary>
        /// 克隆原来的Panel以实现设计的参数传递。
        /// </summary>
        /// <param name="raw"></param>
        public void Clone(Panel raw)
        {
            this.Size = raw.Size;
            this.Bounds = raw.Bounds;
            this.Anchor = raw.Anchor;
            this.BorderStyle = raw.BorderStyle;
            this.Name = raw.Name;
            this.TabIndex = raw.TabIndex;
            this.BackColor= raw.BackColor;
        }
        public double ProgressValue { get; set; }

        Brush foreBrush;

        /// <summary>
        /// 绘制背景，快但是不能耗时太久，会闪
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            e.Graphics.Clear(this.BackColor);
            e.Graphics.FillRectangle(foreBrush, 0, 0, (int)((double)e.ClipRectangle.Width * ProgressValue), e.ClipRectangle.Height);
        }

        /// <summary>
        /// 绘制耗时较多的部分
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);//控件必须通过重写它从 Control 继承的 OnPaint 方法来提供呈现逻辑。
            

            //测量string应该较为耗时，放在此处绘制
            SizeF size = e.Graphics.MeasureString(Text, TextFont);
            if (!string.IsNullOrEmpty(Text))
                e.Graphics.DrawString(Text, TextFont, TextForeColor, Width / 2 - size.Width / 2, Height - size.Height - 2);
        }
    }
}
